/*
 * @Author: 13938960424 1758142861@qq.com
 * @Date: 2023-10-25 15:38:13
 * @LastEditors: 13938960424 1758142861@qq.com
 * @LastEditTime: 2023-10-25 16:25:52
 * @FilePath: /sjf/new-xshell/muduo/pre_knowledge/regex_test.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <string>
#include <regex>

bool easy()
{
    std::string str = "/http/1758";
    std::smatch matches;
    std::regex e("/http/(\\d+)");
    bool ret = std::regex_match(str,matches,e);
    if(ret == false)
        return -1;
    for(auto &s : matches)
    {
        std::cout << s << std::endl;
    }
    return true;
}
bool middle()
{
    std::string str = "GET /bitejiuyeke/login?user=tingzs111&pass=123456 HTTP/1.1\r\n";
    std::smatch matches;
    //std::regex e("(GET|POST|HEAD|PUT|DELETE) .*");
    //(GET|POST|HEAD|PUT|DELETE) 表示的是匹配括号中的任意一个并打印出来
    //空格就是str中的空格 ./表示的就是后序的所有字符

    //std::regex e1("(GET|POST|HEAD|PUT|DELETE) ([^?]*).*");
    //[^?]* 中的^?表示的是不匹配? ([^?]*)表示的就是把?前的打印出来

    //std::regex e2("(GET|POST|HEAD|PUT|DELETE) ([^?]*)\\?(.*) .*");
    //\\?(.*) \\?表示的就是?字符 (.*)就是打印所有，然后加起来就是打印?之后的直到空格位置

    //std::regex e3("(GET|POST|HEAD|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1.[01])");
    //(HTTP/1.[01]) [01]表示的就是匹配0或1 加起来就是HTTP/1.1或者HTTP/1.0

    //std::regex e4("(GET|POST|HEAD|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1.[01])(?:\n|\r\n)?");
    //(?:\n|\r\n)? (?: ..)表示的是匹配..该格式字符串，但是不捕捉 后面的?表示的是匹配(?: ..)0次或1次
    
    std::regex e5("(GET|POST|HEAD|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1.[01])(?:\n|\r\n)?");
    //(?:\\?(.*))? 表示的是对于账号和密码有了匹配,没了不匹配
    bool ret = std::regex_match(str,matches,e5);
    if(ret == false)
        return false;
    for(auto &s : matches)
    {
        std::cout << s << std::endl;
    }
    return true;
}
int main()
{
    middle();
    return 0;
}